iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 9
0
自我挑戰組

今晚我想來點 Ruby on Rails 系列 第 9

<Day 9>where, find_by, find,今夜の注文はとつち?

  • 分享至 

  • xImage
  •  

在 rails 裡,你可以透過你的 models 跟資料庫發出請求取得你的資料,你可以用 ActiveRecord methods 像是 where, find, find_by

find_by 會取得單筆資料或是 nil

where 方法允許取出符合條件的記錄,where 即代表了 SQL 語句的 WHERE 部分。條件可以是字串、陣列、或是 Hash。

find 會找到第一筆符合的資料(通常是 id ),如果沒有找到資料會噴錯。

換句話說,如果你期望找到一筆資料( 特定的 user )使用 find_by,如果想要找到多筆資料( 多筆 users )使用 where。但是 where 有許多用法常常會讓新手困惑例如我。

基本的 where 情境

用 where 發送請求的的目的就是要在資料庫裡面過濾資訊後拿到你要的資料,例如你可以請求多個條件符合你的需求。

Book.where(category: "Ruby", author: "Jesus Castello")

這樣會回傳同時符合類別跟作者的資料範圍。

where 大於&小於

如果你想看看哪些資料大於&小於你可以這樣做

Book.where("LENGTH(title) > 20")

如果你想要插入一個比較值,請服用下列方法
Book.where("LENGTH(title) > :min", min: params[:min_length])

where not

如果你想要看你設定的條件不是 true ,你就可以使用 where 加上 not 方法,例如:
Book.where.not(category: "Java")
或者是
Book.where.not(title: nil)
上面這個 where.not 的用法就會找到 book 的 title 不是 nil。

or 的使用

這裡介紹的是 where 與 or 方法取得兩個或以上符合條件的資料,你可以這樣用:
Book.where(category: "Programming").or(Book.where(category: "Ruby"))
上面這個用法可以結合兩種請求

where 陣列用法

where 結合陣列的用法可以用來尋找多筆值
Book.where(id: [1,2,3])
結合陣列的用法可以在同一個時間找到所有的 id
SELECT "books".* FROM "books" WHERE "books"."id" IN (1, 2, 3)
你可以在 rails logs 裡面看到上面這個SQL請求語法

結合關係條件

如果你需要尋找得值是與另一個 table 相關, joins 方法可以解決這個問題,例如:
Book.joins(:comments).where(comments: { id: 2 })
使用這個請求你會找到所有的書,而那些書都帶有一個 id 是 2 的 comment,你也可以用字串表達
Book.joins(:comments).where("comments.id = 2")
comment 是 table 的名稱, id 是 column 名稱。


上一篇
<Day 8>今天來學學 Select 方法
下一篇
<Day 10>為什麼要使用 nil?
系列文
今晚我想來點 Ruby on Rails 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言